package jeudame.Controleur;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import jeudame.Vue.Monpanel;
import jeudame.Modele.DamierModel;

/**
 * Class Controleur: Le controleur qui va gérer les interactions que peut avoir le joueur avec l'interface
 * @author Bilal and David
 */
public class Controleur
{
    /*
     * Declaration des attributs
     */

    /**
     * La fenêtre sur laquelle on est
     */
    JFrame frame = new JFrame();


    String Plateau= "Images"+java.io.File.separator+"Plateau.jpg";
    String PionB = "Images"+java.io.File.separator+"Pion_Blanc.png";
    String PionN= "Images"+java.io.File.separator+"Pion_Noir.png";
    String DameB = "Images"+java.io.File.separator+"Pion_Blanc_Dame.png";
    String DameN = "Images"+java.io.File.separator+"Pion_Noir_Dame.png";

    Monpanel Interface = new Monpanel(Plateau, PionB, PionN, DameB, DameN);

    DamierModel PlateauJeu = new DamierModel(Interface); // A CHANGER EN DAMIERMODEL


    private int ClickX=0, ClickY=0; // Les coordonnées du clique de la souris
    private int Click1X=0, Click1Y=0; // Les coordonnées du clique de la souris du premier clique du joueur
    private int Click2X=0, Click2Y=0; // Les coordonnées du clique de la souris du deuxième clique du joueur

    private int IndicePieceSelection=-1; // L'indice de la pièce sélectionnée


    /**
     * Constructeur par défaut du controleur
     */
    public Controleur()
    {
        //Centrer l'image
        Interface.setStretch(false);


        /*
         * Initialisation des attributs
         */
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.add(Interface);
        frame.setSize(800, 710); // Fixe la taille de la fenêtre
        frame.setResizable(false); // Fixe la fenêtre
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setTitle("Jeu de Dames"); // Met à jour le nom de la fenêtre
        Image im = Toolkit.getDefaultToolkit().getImage("Images"+java.io.File.separator+"jeudame_icone.jpg"); // Met à jour l'icone de la fenêtre
        frame.setIconImage(im);


         /**
         * On utilise ici un MouseAdapter qui est une classe.
         * L'équivalent du Mouselistener, on peut surcharger les méthodes Mouselistener que l'on souhaite
         */
        Interface.addMouseListener(
                new MouseAdapter()
            {
            @Override
              public void mouseClicked(MouseEvent evt)
              {
                    if(evt.getButton()==evt.BUTTON1) // Lorsque le joueur fait un clique gauche
                    {

                    
                        //Recupère les positions du clique de la souris
                        ClickX= evt.getX();
                        ClickY= evt.getY();

                         // On est sur le bouton Reinitialiser
                        if(ClickX > 201 && ClickX < 351 && ClickY < 73 && ClickY > 26)
                        {
                            int test=javax.swing.JOptionPane.showConfirmDialog(null, "Voulez-vous recommencer?", "Input", javax.swing.JOptionPane.YES_NO_OPTION); // On demande aux s'ils veulent recommencer
                            if(test==javax.swing.JOptionPane.YES_OPTION) // On réinitialise la fenêtre totalement
                            {
                                PlateauJeu.getDamier().initfenetre();
                            }
                        }
                             // On est en dehors du tableau
                            if(!(ClickX > 194 && ClickX < 723 && ClickY < 648 && ClickY > 110) && !(ClickX > 201 && ClickX < 351 && ClickY < 73 && ClickY > 26))
                        {
                        }
                        else
                        {
                            if(Interface.RecherchePiece(ClickX, ClickY)==-1 && !Interface.GetCaseSelectionnee()) // On teste si la piece est trouvé dans le tableau  PTIT BUG
                            {
                                 Interface.SetCaseSelectionnee(false);
                            }
                            else
                            {
                                if(Interface.RecherchePiece(ClickX, ClickY)==IndicePieceSelection && Interface.RecherchePiece(Click2X, Click2Y)!=IndicePieceSelection )// Si la piece est cliqué deux fois
                                {
                                    if(!Interface.GetCaseSelectionnee())
                                    {
                                        Interface.SetCaseSelectionnee(true);
                                    }
                                    else
                                    {
                                        if(Interface.GetCaseSelectionnee())
                                            Interface.SetCaseSelectionnee(false);
                                        else
                                            Interface.SetCaseSelectionnee(true);
                                    }
                                }
                                else  // Lorsqu'on a cliqué sur une pièce, qu'elle a été trouvée, et qu'elle n'a été cliqué qu'une fois
                                {
                                    // Si la case est selectionnée, ou si la case n'est pas selectionnée et que le joueur 1 n'a pas encore joué, ou le joueur 2 n'a pas encore joué
                                    if(Interface.GetCaseSelectionnee() || (!(Interface.GetCaseSelectionnee()) && ((PlateauJeu.getJoueur()==1 && PlateauJeu.getDamier().getPieceColor(convertXPixelToX(ClickX), convertYPixelToY(ClickY)).equalsIgnoreCase("Blanc")) || (PlateauJeu.getJoueur()==2 && PlateauJeu.getDamier().getPieceColor(convertXPixelToX(ClickX), convertYPixelToY(ClickY)).equalsIgnoreCase("Noir")))))
                                    {
                                            // Si la case était selectionnée, elle le ne devient plus selectionnée, et si elle n'était pas selectionnée, elle le devient
                                        if(Interface.GetCaseSelectionnee())
                                            Interface.SetCaseSelectionnee(false);
                                        else
                                            Interface.SetCaseSelectionnee(true);

                                        if(Interface.GetCaseSelectionnee())
                                        {
                                            Click1X=ClickX;
                                            Click1Y=ClickY;
                                            IndicePieceSelection=Interface.RecherchePiece(Click1X, Click1Y);
                                            Interface.PieceSelection(IndicePieceSelection); // On met a jour l'id correspondant à la case selectionnée
                                        }
                                        else
                                        {
                                            //Deuxième clique
                                            Click2X=ClickX;
                                            Click2Y=ClickY;

                                                //  Si la pièce selectionnée est un pion blanc
                                            if(Interface.RenvoiImagePiece(IndicePieceSelection).equals(PionB))
                                            {
                                                if(PlateauJeu.getDamier().deplacerPion((convertXPixelToX((Interface.getPiecePositionX(IndicePieceSelection)))), convertYPixelToY((Interface.getPiecePositionY(IndicePieceSelection))), convertXPixelToX(Click2X), convertYPixelToY(Click2Y))) // calcul pour convertir: (X-(X%53)-194)/53) et -(Y-(Y%54)+649+54)/54
                                                {
                                                        // On deplace la pièce
                                                    Interface.Deplacement(IndicePieceSelection, (Click2X -((Click2X-194)%53)), (Click2Y -((Click2Y-595)%54)));
                                                        // On vérifie si elle n'est pas devenue une dame
                                                    PlateauJeu.getDamier().checkDame(convertXPixelToX(Click2X), convertYPixelToY(Click2Y));

                                                        // Au joueur 2 de jouer
                                                    PlateauJeu.setJoueur(2);
                                                    Interface.setJoueur("Joueur 2");

                                                }
                                            }
                                            else if (Interface.RenvoiImagePiece(IndicePieceSelection).equals(PionN))
                                            {
                                                    if(PlateauJeu.getDamier().deplacerPion(((Interface.getPiecePositionX(IndicePieceSelection)-194)/53), (-(Interface.getPiecePositionY(IndicePieceSelection)-595-54)/54), convertXPixelToX(Click2X), convertYPixelToY(Click2Y))) // calcul pour convertir: (X-194-53)/53 et (-Y+595-54)/54
                                                    {
                                                                // On deplace la pièce
                                                        Interface.Deplacement(IndicePieceSelection, (Click2X -(moduloCaseX(Click2X))), (Click2Y -moduloCaseY(Click2Y)));
                                                                // On verifie si elle n'est pas denue une dame
                                                        PlateauJeu.getDamier().checkDame(convertXPixelToX(Click2X), convertYPixelToY(Click2Y));

                                                                // Au joueur 1 de jouer
                                                         PlateauJeu.setJoueur(1);
                                                         Interface.setJoueur("Joueur 1");
                                                    }
                                            }
                                            else if ((Interface.RenvoiImagePiece(IndicePieceSelection).equals(DameN))||(Interface.RenvoiImagePiece(IndicePieceSelection).equals(DameB))){
                                                    if(PlateauJeu.getDamier().deplacerPion(((Interface.getPiecePositionX(IndicePieceSelection)-194)/53), (-(Interface.getPiecePositionY(IndicePieceSelection)-595-54)/54), convertXPixelToX(Click2X), convertYPixelToY(Click2Y))) // calcul pour convertir: (X-194-53)/53 et (-Y+595-54)/54
                                                    {

                                                        Interface.Deplacement(IndicePieceSelection, (Click2X -(moduloCaseX(Click2X))), (Click2Y -moduloCaseY(Click2Y)));
                                                        if(PlateauJeu.getJoueur()==2){
                                                            PlateauJeu.setJoueur(1);
                                                            Interface.setJoueur("Joueur 1");
                                                        }
                                                        else{
                                                            PlateauJeu.setJoueur(2);
                                                            Interface.setJoueur("Joueur 2");

                                                         }

                                                    }
                                            }
                                        }
                                    }
                                }

                                Interface.repaint();
                            }
                        }
                  }
                }
            }
        );
    }

    /**
     * Converti les coordonnées X de l'interface graphique en un indice X du tableau de pièce
     * @param xPixel
     * @return le resultat de la conversion
     */
    private int convertXPixelToX(int xPixel){
        return ((xPixel - moduloCaseX(xPixel)-194)/53);
    }

    /**
     * Converti les coordonnées Y de l'interface graphique en un indice Y du tableau de pièce
     * @param yPixel
     * @return le resultat de la conversion
     */
    private int convertYPixelToY(int yPixel){
        return ((-(yPixel) + moduloCaseY(yPixel)+649)/54);
    }

    /**
     * Converti l'indice X en des coordonnées X de l'interface graphique
     * @param indice
     * @return le resultat de la conversion
     */
    private int convertXtoXPixel(int indice){
        return (indice*53 + 194);
    }

    /**
     * Converti l'indice Y en des coordonnées Y de l'interface graphique
     * @param indice
     * @return le resultat de la conversion
     */
    private int convertYToYPixel(int indice){
        return (indice*54 + 649);
    }

    /**
     * Effectue une partie du calcul, le modulo
     * @param xPixel
     * @return du calcul
     */
    private int moduloCaseX(int xPixel){
        return ((xPixel-194)%53);
    }

    /**
     * Effectue une partie du calcule, le modulo
     * @param yPixel
     * @return du calcul
     */
    private int moduloCaseY(int yPixel){
        return ((yPixel-649)%54);
    }
}
